/**
 * Vector 向量
 * 一、定义
 * 1. new   Vec::new();
 * 2. 采用宏  vec![1, 2, 3];
 * 二、操作
 * 0.读取   索引语法或者 get 方法 ,注意索引从0开始. vec[0]或者vec.get(0)
 *          vec[i] 不会改变所有权
 *          get(i) 返回的是一个Option类型,同样不会改变所有权
 * rust也要照顾到大家的习惯，不要读取一个索引就改变所有权。如果是那样实在太麻烦了。
 * 
 *          panic 和None
 * 1.添加   push ，添加都尾部
 * 2.修改   vec[0] = 10;
 * 3.删除   pub,remove
 * 4.遍历  
 *    a. 简单语法  for i in &vec {}
 *    b. 迭代器  for i in vec.iter() {}
 *    c. for+get  for i in 0..vec.len() { let e = &v[i]; }
 * 三、向量和枚举
 *  利用枚举的特性，而已让向量存储不同类型的数据，这是因为枚举允许不同成员有不同类型的数据
 * 四、特点
 *  1.长度可变，容量自动管理 
 *  2.内部无边界检查，panic 
 *  3.元素类型必须相同
 *  4.可存放任何类型数据，包括引用
 *  5.某种情况下，类似java的List，但比java的List差，因为java的List可以存储不同类型成员
 * 五、总结
 *  向量具有许多的方法，需要自行去看api文档，无法一一列出，也没有必要。
 */

 fn main() {
    //1.0 定义
    let mut height_arr: Vec<i32> = Vec::new();    
    //1.1 宏定义
    let  arr = vec![1, 2, 3];
    println!("{:?} 共有{}个元素", arr,arr.len());
    //2.0 添加元素
    height_arr.push(145);
    height_arr.push(150);
    height_arr.push(160);
    println!("{:?} 共有{}个元素", height_arr,height_arr.len());
    //2.1 访问具体元素- 常规的方法不会导致所有权转移
    let a1 = height_arr[0];
    let a2= height_arr.get(1).unwrap();
    println!("a1={},a2={}", a1,a2);
    //2.2 使用索引访问，测试越界访问。这会导致程序异常，并终止
    //如果是get越界，会返回None
    //thread 'main' panicked at xx.rs:52:24:
    //index out of bounds: the len is 7 but the index is 10
    println!("访问越界元素");
    //let a3 = height_arr[10];  //这会导致程序异常，并终止
    let a3= height_arr.get(10);
    if let None = a3 {
        println!("不存在第11个元素:{}","None");
    }    

    //3.0 修改元素
    height_arr[0] = 131;
    //4.0 删除元素
    height_arr.pop();  //移除最后一个元素
    println!("{:?} 移除一个后，还有{}个元素", height_arr,height_arr.len());
    //5.0 遍历
    //5.1 简单语法
    println!("遍历一、简单语法遍历向量，所有权转移");
    //for i in height_arr  这样会导致所有权转移
    //这里必须使用引用，否则用过之后，所有都转移了。后续要是再使用则会报错
    for i in &height_arr {
        println!("{}", i);
    }
    //5.2 迭代器-这个方式不会改变所有权，后面可以继续使用原来的变量
    println!("遍历二、迭代器遍历向量，所有权不转移");
    for i in height_arr.iter() {
        println!("{}", i);
    }
    //5.3 for+get
    // 索引法和get方法都不会导致所有权转移，所以可以继续使用原来的变量
    println!("遍历三、for+索引遍历向量，所有权不转移");
    for i in 0..height_arr.len() {
        let e = height_arr[i];
        let b = height_arr.get(i);
        println!("{},{:?}", e,b);
    }
 }

